home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
EDUCATE
/
RADDECAY.ARJ
/
RADDKLIB.TRU
< prev
next >
Wrap
Text File
|
1987-11-19
|
51KB
|
1,017 lines
MODULE raddklib
! 9/28/87
DECLARE PUBLIC true,false,recpath$,va$,screen$
DECLARE PUBLIC nuclide$(),first_time,at_names$(),mol_wt()
SHARE blank$,a$(63)
SHARE element_ID(497) ! element index corresponding to alphbetic sequence
DECLARE DEF spaces$,rjust$,ljust$,center$,notrail$
LET first_time = 1 ! that is, true
SUB pick_one_nuclide(pick_nuclide)
! 9/27/87
! This routine selects a nuclide from a name display and returns their array indices
! a$ is an array to be scrolled; each a$ contains eight nuclide names
! array index for nuclide based on position
DEF iso_index(defrow,defcolumn) = (defrow - 1)*8 + defcolumn
DIM flag(497)
LET numnucl = 497
CALL divide( numnucl,8,maxrows,lastcol)
IF lastcol > 0 then LET maxrows = maxrows + 1
IF lastcol = 0 then LET lastcol = 8
LET indent = 5 ! tab location of first name
LET line1 = 5 ! first printed line on screen
LET lastline = 24 ! last printed line on screen
LET columns = 8 ! number of names horizontally on each row
LET width = 9 ! field width for each name
LET lines = lastline - line1 + 1 ! number of lines on page
FOR row = 1 to maxrows
! set up strings for scrolling
LET a$(row) = repeat$(" ",indent-1)
FOR column = 1 to columns
LET index = iso_index(row,column)
IF index <= numnucl then LET a$(row) = a$(row) & nuclide$(index) & " "
NEXT column
NEXT row
IF first_time = false then
CALL textshow(screen$,round(1),round(1))
ELSE
CLEAR
CALL highlight
CALL print_centered(" SELECT NUCLIDE ")
CALL normal
CALL print_centered("Use arrow keys, [PgUp], [PgDn], [Home], [End] for locating.")
CALL print_centered("Press [Enter] to select a nuclide; [Esc] to abandon.")
PRINT repeat$("═",80);
! fill initial screenful
FOR row = 1 to lines ! fills from top down
PRINT tab(line1+row-1,2); a$(row)
FOR column = 1 to columns
LET index = iso_index(row,column)
IF index <= numnucl then CALL check_pick(index,row,column,flag(index),0)
NEXT column
NEXT row
CALL textkeep(1,80,1,25,screen$)
LET first_time = false
END IF
LET last = lines ! row of a$ that is displayed last on the page
LET row = 1 ! row in array 1 to maxrows
LET column = 1 ! horizontal location of cursor
LET first = 1 ! row of a$ that is displayed first on the page
LET vert = 1 ! cursor vertical position, screen line after line 1
LET index = 1
CALL check_pick(index,vert,column,2,1) ! shows first position in inverse
WHEN error in
DO
CALL getkey(key)
SELECT CASE key
CASE 13 ! done - reassign values,then exit subroutine
LET pick_nuclide = iso_index(row,column) ! rtn answer
EXIT SUB
CASE 27
CAUSE ERROR 100 ! leave via error handler without any changes
CASE 327,328,329,331,333,335,336,337 ! cursor moves
CALL check_pick(index,vert,column,flag(index),1)
SELECT CASE key
CASE 327 ! Home
FOR i = row to 1 step -1
CALL up_one ! scroll the whole business
NEXT i
LET column = 1
LET row = 1
LET vert = 1
CASE 335 ! end
FOR i = row to maxrows
CALL down_one ! scroll the whole business
NEXT i
LET row = maxrows
LET vert = lines
LET column = lastcol
CASE 328 ! up cursor
IF vert > 1 then
LET row = row - 1
LET vert = vert - 1
ELSE
CALL up_one
LET row = max(1,row - 1)
END IF
CASE 329 ! PgUp
LET diff = last - row
FOR i = 1 to lines
CALL up_one
NEXT i
LET row = last - diff
CASE 331 ! left cursor
LET column = column - 1
IF column < 1 then
LET column = columns
IF row = maxrows and column > lastcol then LET column = lastcol
END IF
CASE 333 ! right cursor
LET column = column + 1
IF column > columns then LET column = 1
IF row = maxrows and column > lastcol then LET column = 1
CASE 336 ! down cursor
IF vert < lines then
LET row = row + 1
LET vert = vert + 1
ELSE
CALL down_one
LET row = min(maxrows,row + 1)
END IF
IF row = maxrows and column > lastcol then LET column = lastcol
CASE 337 ! PgDn
LET diff = row - first
FOR i = lines to 1 step -1
CALL down_one
NEXT i
LET row = first + diff
IF row = maxrows and column > lastcol then LET column = lastcol
END SELECT
LET index = iso_index(row,column)
CALL check_pick(index,vert,column,2,1)
CASE ELSE
END SELECT
LOOP
USE
IF extype = 100 then
EXIT HANDLER ! handle at higher level
ELSE ! unexpected
CALL fatal(0,"","")
END IF
END WHEN
SUB down_one
! move down one line - scroll page up one line if on bottom line
IF last < maxrows then
CALL scroll(line1,2,lastline,78,1)
LET last = last + 1
SET CURSOR lastline,2
PRINT a$(last);
FOR horz = 1 to columns
LET index2 = iso_index(last,horz)
IF index2 <= numnucl then CALL check_pick(index2,lines,horz,flag(index2),0)
NEXT horz
LET first = first + 1
END IF
END SUB
SUB up_one
! move up one line - scroll page down one line if on top line
IF first > 1 then
CALL scroll(line1,2,lastline,78,-1)
LET first = first - 1
SET CURSOR line1,2
PRINT a$(first);
FOR horz = 1 to columns
LET index2 = iso_index(first,horz)
CALL check_pick(index2,1,horz,flag(index2),0)
NEXT horz
LET last = last - 1
END IF
END SUB
SUB check_pick(chekindx,printrow,printcolumn,chekflg,onetime)
! print nuclide$(chekindx) in proper color
SELECT CASE chekflg
CASE 0 ! indicates that no display change is required
IF onetime = 0 then EXIT SUB ! whole line already printed
CASE 1 ! indicates that nuclide$(chekindx) is selected
CALL highlight
CASE 2 ! indicates that cursor is on nuclide$(chekindx)
CALL inverse
CASE ELSE
END SELECT
SET CURSOR line1 + printrow - 1,indent + (printcolumn-1)*width + 1
PRINT nuclide$(chekindx);
LET nameandno$ = center$(" Cursor on: "&at_names$(element_ID(chekindx))&" - Index: "&str$(chekindx)& " ",80,"═")
CALL highlight
PRINT tab(4,1);nameandno$;
CALL normal
END SUB
END SUB
SUB show_nuclide(nuclide)
! retrieves information and displays information for record nuclide
! nuclide is the record # in the NUCLIDES.REC file
DEF file$(str$) = recpath$ & str$ & ".REC"
DIM daughter_id(2),daughter_branch(2),var(200,3),msg$(2)
DIM chainID(31),afinal(31),decay(5) ! needed for displaying chain
DO ! until successful or user quits
WHEN error in
OPEN #1: name file$("NUCLIDES"), access input, recsize 41
SET #1: RECORD nuclide
READ #1: record$
CLOSE #1
EXIT DO
USE
CLOSE #1
CALL file_err("Unable to read nuclide file:",file$("NUCLIDES"))
END WHEN
LOOP
CALL uncram_record
IF unit$ = "S" then LET half_time$ = "seconds"
IF unit$ = "M" then LET half_time$ = "minutes"
IF unit$ = "H" then LET half_time$ = "hours"
IF unit$ = "D" then LET half_time$ = "days"
IF unit$ = "Y" then LET half_time$ = "years"
IF daughters > 0 then
DO ! until successful or user quits
WHEN error in
OPEN #1: name file$("PROGENY"), recsize 16, access input
FOR i = 1 to daughters
LET R = daughter_pointer + i - 1
SET #1: RECORD R
READ #1: record$
LET daughter_id(i) = num(record$[1:8])
LET daughter_branch(i) = num(record$[9:16])
NEXT i
CLOSE #1
EXIT DO
USE
CLOSE #1
CALL file_err("Unable to read nuclide file:",file$("PROGENY"))
END WHEN
LOOP
END IF
! Show radionuclide characteristics
CLEAR
CALL plain_double_edge_box(1,1,33,5)
CALL plain_double_edge_box(6,1,33,25)
CALL plain_double_edge_box(1,34,80,25)
LET trimmed_name$ = trim$(nuclide_name$)
CALL textkeep(35,79,2,24,blank$) ! for blanking right side box
CALL highlight
PRINT tab(3,16-len(trimmed_name$)/2); " "&trimmed_name$&" "
CALL normal
LET nameprint$ = "("&at_names$(at_no)&")"
PRINT tab(4,17-len(nameprint$)/2);nameprint$
SET CURSOR 7,1
PRINT "║ Atomic number :";at_no
PRINT "║ Element weight:";mol_wt(at_no)
IF half_life < 99000 then
PRINT "║ Half life :";half_life;
ELSE
PRINT using "║ Half life :#.###^^^^ ":half_life;
END IF
PRINT half_time$
FOR i = 1 to daughters
PRINT using "║ Daughter : ########":nuclide$(daughter_id(i))
PRINT "║ Branch ratio :"; daughter_branch(i) ! branching is branching ratio
NEXT i
SET CURSOR 14,1
PRINT "║ Record files info retrieval:"
PRINT "║ Number of press"
PRINT "║ records key "
PRINT using "║ Alphas : #### [A]": alphas
PRINT using "║ Betas : #### [B]": betas
PRINT using "║ Positrons: #### [P]": positrons
PRINT using "║ Electrons: #### [E]": electrons
PRINT using "║ Gammas : #### [G]": photons
PRINT "║ (and X rays) "
PRINT
PRINT "║";
CALL highlight
PRINT " Return to names list [Esc] ";
CALL normal
CALL show_nuclide_instruction
! Now display the decay product characteristics
DO
CALL getkey(key)
SELECT CASE key
CASE 97,65 ! a or A
IF alphas > 0 then
CALL get_var(#2,var,file$("ALPHA"),alphas,alpha_pointer,2,ok)
IF ok = false then EXIT DO
CALL show_var(var,"Alphas",alphas,2)
END IF
CASE 98,66 ! b or B
IF betas > 0 then
CALL get_var(#2,var,file$("BETAS"),betas,beta_pointer,3,ok)
IF ok = false then EXIT DO
CALL show_var(var,"Betas",betas,3)
END IF
CASE 112,80 ! p or P
IF positrons > 0 then
CALL get_var(#2,var,file$("POSITRON"),positrons,positron_pointer,3,ok)
IF ok = false then EXIT DO
CALL show_var(var,"Positrons",positrons,3)
END IF
CASE 101,69 ! e or E
IF electrons > 0 then
CALL get_var(#2,var,file$("ELECTRON"),electrons,electron_pointer,2,ok)
IF ok = false then EXIT DO
CALL show_var(var,"Electrons",electrons,2)
END IF
CASE 71,103 ! g or G
IF photons > 0 then
CALL get_var(#2,var,file$("PHOTONS"),photons,photon_pointer,2,ok)
IF ok = false then EXIT DO
CALL show_var(var,"Gammas & X-rays",photons,2)
END IF
CASE 13,27 ! [Return],[Esc]
EXIT DO
CASE 68,100 ! [D],[d] - show display chain for nuclide
CALL save_screen ! remember screen
CALL decay_period(decay) ! get decay time
CALL days(dkdays,decay) ! convert decay period to days
CALL restore_screen
CALL number_box(activity)
CALL decay_chain(nuclide,activity,chainID,afinal,dkdays,true)
CALL restore_screen
CASE 42,315 ! Printer request - [PrtSc] or [F1]
CALL textshow(blank$,round(35),round(2))
CALL blink
PRINT tab(13,35);center$("PRINTING",45," ")
CALL normal
CALL print_nuclide_information
CALL show_nuclide_instruction
CASE else
END SELECT
LOOP
SUB print_nuclide_information
WHEN error in
OPEN # 5: printer
PRINT #5
PRINT #5: tab(23-len(trimmed_name$)/2); trimmed_name$
PRINT #5: tab(23-len(trimmed_name$)/2); repeat$("=",len(trimmed_name$))
PRINT #5
PRINT #5: tab(8);"Atomic number :";at_no
PRINT #5: tab(8);"Atomic weight :";at_weight
PRINT #5: tab(8);"Half life :";half_life;half_time$
FOR i = 1 to daughters
PRINT #5: tab(8);"Daughter : "; nuclide$(daughter_id(i))
PRINT #5: tab(8);"Branching fraction:"; daughter_branch(i)
NEXT i
IF alphas > 0 then
CALL get_var(#2,var,file$("ALPHA"),alphas,alpha_pointer,2,ok)
IF ok = true then CALL print_var(#5,var,"Alphas",alphas,2)
END IF
IF betas > 0 then
CALL get_var(#2,var,file$("BETAS"),betas,beta_pointer,3,ok)
IF ok = true then CALL print_var(#5,var,"Betas",betas,3)
END IF
IF positrons > 0 then
CALL get_var(#2,var,file$("POSITRON"),positrons,positron_pointer,3,ok)
IF ok = true then CALL print_var(#5,var,"Positrons",positrons,3)
END IF
IF electrons > 0 then
CALL get_var(#2,var,file$("ELECTRON"),electrons,electron_pointer,2,ok)
IF ok = true then CALL print_var(#5,var,"Electrons",electrons,2)
END IF
IF photons > 0 then
CALL get_var(#2,var,file$("PHOTONS"),photons,photon_pointer,2,ok)
IF ok = true then CALL print_var(#5,var,"Gammas & X-rays",photons,2)
END IF
PRINT #5: chr$(12) ! formfeed
CLOSE #5
USE
WHEN error in
CLOSE #5
USE ! ignore err
END WHEN
CALL bleep
LET msg$(1) = " PRINTER ERROR! "
LET msg$(2) = " Please fix and try again."
CALL info_window(msg$,0)
END WHEN
END SUB
SUB uncram_record
! TrueBasic unpackb unpacks an integer from bit locations as specified
! Atomic weight has been left as a number in anticpation of eventual precise values
! record$ contains 41 bytes, packed into 324 bits; 40 bytes & 2 bits
LET nuclide_name$ = record$[1:8]
LET at_weight = num(record$[9:16]) ! atomic weight; 8 bytes
LET at_no = unpackb(record$,129, 8) ! byte 17
LET half_life = num(record$[18:25])
LET unit$ = record$[26:26]
LET daughters = unpackb(record$,209, 2)
LET daughter_pointer = unpackb(record$,211, 9)
LET alphas = unpackb(record$,220, 7)
LET alpha_pointer = unpackb(record$,227,13)
LET betas = unpackb(record$,240, 8)
LET beta_pointer = unpackb(record$,248,13)
LET positrons = unpackb(record$,261, 8)
LET positron_pointer = unpackb(record$,269,13)
LET electrons = unpackb(record$,282, 8)
LET electron_pointer = unpackb(record$,290,13)
LET photons = unpackb(record$,303, 8)
LET photon_pointer = unpackb(record$,311,13)
END SUB
END SUB
SUB get_var(#999,var(,),file_name$,sets,set_pointer,indices,ok)
MAT var = zer
DO ! until successful or user quits
WHEN error in
OPEN #999: name file_name$,access input,recsize 8*indices
EXIT DO
USE
CLOSE #999
CALL file_err("Unable to read nuclide file:",file_name$)
END WHEN
LOOP
LET ok = true
FOR i = 1 to sets
LET R = set_pointer + i - 1
SET #999: RECORD R
READ #999: record$
IF indices = 2 then
LET var(i,1) = num(record$[1:8])
LET var(i,2) = num(record$[9:16])
ELSE
LET var(i,1) = num(record$[1:8])
LET var(i,2) = num(record$[9:16])
LET var(i,3) = num(record$[17:24])
END IF
NEXT i
CLOSE #999
END SUB
SUB print_var(#5,var(,),text$,sets,indices)
PRINT #5:
PRINT #5: tab(7);repeat$("=",(14-len(text$)/2));" ";text$;": ";repeat$("=",(14-len(text$)/2))
PRINT #5:
IF indices = 3 then
PRINT #5: tab(5);" probability maximum average"
PRINT #5: tab(5);" per decay (MEV) (MEV)"
ELSE
PRINT #5: tab(5);" probability energy"
PRINT #5: tab(5);" per decay (MEV)"
END IF
PRINT #5:
FOR i = 1 to sets
IF indices = 3 then
PRINT #5: tab(5);
PRINT #5,using " ### ##.###### ##.######":i,var(i,3),var(i,1);
! the following is to accomodate lack of info for C-15
IF var(i,2) < 99 then PRINT #5,using " ##.######":var(i,2) else PRINT #5
ELSE
PRINT #5: tab(5);
PRINT #5,using " ### ##.###### ##.######":i,var(i,2),var(i,1)
END IF
NEXT i
END SUB
SUB show_var(var(,),text$,sets,indices)
! indices is number of entries per set; must be 2 or 3
DIM b$(200)
CALL textshow(blank$,round(35),round(2))
PRINT tab(2,(56 - len(text$)/2));text$
IF indices = 3 then
PRINT tab(36);" probability maximum average"
PRINT tab(36);" per decay (MEV) (MEV)"
ELSE
PRINT tab(36);" probability energy"
PRINT tab(36);" per decay (MEV)"
END IF
IF sets > 20 then
FOR i = 1 to sets
IF indices = 3 then
LET b$(i) = using$(" ### ##.###### ##.######",i,var(i,3),var(i,1))
! the following is to accomodate lack of info for C-15
IF var(i,2) < 99 then LET b$(i) = b$(i) & using$(" ##.######",var(i,2))
ELSE
LET b$(i) = using$(" ### ##.###### ##.######",i,var(i,2),var(i,1))
END IF
NEXT i
LET first = 1
CALL scroll_it(b$,sets,first,last,5,24,0,36,79)
DO
CALL getkey(key)
SELECT CASE key
CASE 328,329,336,337
CALL scroll_it(b$,sets,first,last,5,24,key,36,79)
CASE 13,27
EXIT DO
CASE ELSE
END SELECT
LOOP
ELSE
FOR i = 1 to sets
SET CURSOR i+4,36
IF indices = 3 then
PRINT using " ### ##.###### ##.######":i,var(i,3),var(i,1);
! the following is to accomodate lack of info for C-15
IF var(i,2) < 99 then PRINT using " ##.######":var(i,2) else PRINT
ELSE
PRINT using " ### ##.###### ##.######":i,var(i,2),var(i,1)
END IF
NEXT i
DO
CALL getkey(key)
IF key = 13 or key = 27 then EXIT DO
LOOP
END IF
CALL show_nuclide_instruction
END SUB
SUB show_nuclide_instruction
CALL textshow(blank$,round(35),round(2))
PRINT tab( 9,40);"Press [Enter] or [Esc] to clear"
PRINT tab(10,40);"this area when table is shown."
PRINT tab(12,40);"If more than 20 sets are shown,"
PRINT tab(13,40);"use "&va$&", PgUp, & PgDn to scroll."
PRINT tab(15,40);"Press [PrtSc] or [F1] to print."
PRINT tab(17,40);"Press [D] to view decay chain."
END SUB
SUB number_box(activity)
! now get activity in curies
CALL highlight
CALL plain_double_edge_box(10,10,70,16)
PRINT tab(12,15);"Enter curies; any non-number key results in 1."
SET CURSOR "on"
SET CURSOR 14,33
CALL getkey(key)
SELECT CASE key
CASE 48 to 57
CALL Number(1,activity,33,14,14,key,false)
CASE else
LET activity = 1
END SELECT
SET CURSOR "off"
CALL normal
END SUB
SUB scroll_it(b$(),a_max,first,last,first_row,last_row,up_down,left_col,right_col)
! b$ is an array to be scrolled; width = right_col - left_col + 1
! left_col and right_col are column bounds
! first is index of first b$, it is returned to calling routine
! last is index of last b$ on display, it is returned to calling routine
! a_max is maximum dimension of b$
! first_ and last_ row define the screen print range
LET net_rows = last_row - first_row + 1
SELECT CASE up_down
CASE 0 ! initialize subroutine
FOR i = 1 to net_rows ! fills from top down
PRINT tab(first_row+i-1,left_col); b$(first+i-1)
NEXT i
LET last = first + net_rows - 1
CASE 328 ! up cursor
CALL up_one
CASE 329 ! PgUp
FOR i = 1 to net_rows
CALL up_one
NEXT i
CASE 336 ! down cursor
CALL down_one
CASE 337 ! PgDn
FOR i = net_rows to 1 step -1
CALL down_one
NEXT i
CASE ELSE
END SELECT
SUB down_one
! move down one line - scroll page up one line
IF last < a_max then
CALL scroll(first_row,left_col,last_row,right_col,1)
LET last = last + 1
PRINT tab(last_row,left_col); b$(last);
LET first = first + 1
END IF
END SUB
SUB up_one
! move up one line - scroll page down one line
IF first > 1 then
CALL scroll(first_row,left_col,last_row,right_col,-1)
LET first = first - 1
PRINT tab(first_row,left_col); b$(first);
LET last = last - 1
END IF
END SUB
END SUB
SUB read_doc1
DIM line$(105)
MAT READ line$
CLEAR
DATA " GENERAL INFORMATION ABOUT RADDECAY"
DATA " (C.A. Negin - Grove Engineering, Inc. - 10/87)"
DATA " "
DATA "1. INTRODUCTION"
DATA "RADDECAY is a program for displaying radioactive decay information for 497"
DATA "radionuclides. Data provided include the half life, radioactive daughter"
DATA "nuclides, probabilities per decay, and decay product energies for alphas,"
DATA "betas, positrons, electrons, X-rays, and photons."
DATA " "
DATA "2. INSTRUCTIONS FOR THE FIRST-TIME USER"
DATA "All information regarding RADDECAY is on the system diskette. To get started,"
DATA "use any drive and type ""RADDECAY"". This will execute the program and make"
DATA "information available via menu selections. The files may be copied to and"
DATA "executed from a hard disk. There is no copy protection."
DATA " "
DATA "The second diskette contains seven ""record"" (random access) files which"
DATA "contain all the data. They have an extension of "".REC"" with file names that"
DATA "are self explanatory. These files do not have to be on the same drive or DOS"
DATA "directory as the system diskette files. However, they must all be in one"
DATA "directory or sub-directory. More information regarding these files can be"
DATA "read by selecting the file information menu item."
DATA " "
DATA "When RADDECAY executes, it initially reads a file in the same directory with"
DATA "the name RADDECAY.DAT. This file contains parameters which control the screen"
DATA "colors and the DOS path to the data contained in the *.REC files. If this"
DATA "file is not found, then one is created with:"
DATA " "
DATA " a) Default screen colors. If you cannot see the screen because of"
DATA " a strange color combination, press [Esc] from the menu to re-set them."
DATA " "
DATA " b) The path to the *.REC files as the current directory from which"
DATA " RADDECAY was executed."
DATA " "
DATA "When you set these parameters from RADDECAY main menu, they are retained in"
DATA "the RADDECAY.DAT file for the next time the program is run. As received,"
DATA "there is no file on diskette, so it will be created with the defaults the"
DATA "first time it is used."
DATA " "
DATA "If you have a hard disk or an IBM-PC AT with a high capacity drive, we"
DATA "recommend that you create a subdirectory (for example, C:\RADDECAY\) on the"
DATA "high capacity drive and copy files RADDECAY.EXE, and all seven .REC files"
DATA "to it. Then, when you first run RADDECAY, set the path and colors by"
DATA "pressing [Esc]. If you use the nuclide record files for other programs such"
DATA "as Grove Engineering's Microshield or MicroSkyshine, then you should set the"
DATA "record files path to the same subdirectory as for these programs. This will"
DATA "avoid replicate copies of the same data on your hard disk."
DATA " "
DATA "3. PERMISSION FOR MAKING COPIES"
DATA "The two diskettes provided are ""plain vanilla"". Permission is granted for"
DATA "making copies of RADDECAY without any restrictions."
DATA " "
DATA "4. PERMISSION FOR USE OF THE SOURCE CODE"
DATA "Source code provided is sufficient for checking the algorithms use in RAD-"
DATA "DECAY. Programmers may use the source code to any extent they desire. We"
DATA "heartily encourage microcomputers for engineering and analysis work. Note"
DATA "that you will not be able to compile RADDECAY without licensed True Basic"
DATA "library and Grove Engineering library routines for machine interaction. When"
DATA "you create a program that uses any of the .REC files, you should acknowledge:"
DATA " "
DATA " a) RSIC (see 5. below) as the original source of the data, and"
DATA " b) Grove Engineering as the originators of the microcomputer formatted"
DATA " files."
DATA " "
DATA "5. SOURCE OF DATA AND DECAY ALGORITHM"
DATA "Thanks are due to the Radiation Shielding Information Center (RSIC) at Oak"
DATA "Ridge National Laboratories which provided the nuclides library information"
DATA "on diskette so that we could adapt it; and to Dick Bowers of the Perry Nuclear"
DATA "plant who provided the decay algorithm."
DATA " "
DATA "The data contained in these files from the RSIC were received in mid-1986 and"
DATA "is presumed current to that time. These data are the same as that in:"
DATA " "
DATA " RADIOACTIVE DECAY DATA TABLES"
DATA " by David C. Kocher"
DATA " Report DOE/TIC-11026"
DATA " Technical Information Center"
DATA " U.S. Department of Energy,"
DATA " Washington, D.C., 1981"
DATA " "
DATA "which is available through NTIS. We are grateful to RSIC, a government"
DATA "sponsored organization, for providing this public-domain information."
DATA " "
DATA "Grove Engineering added C-15 to this library for purposes of N-16 radiation"
DATA "shielding calculations. Altogether, there are 497 nuclides."
DATA " "
DATA "6. CONVERSION TO MICROCOMPUTER FORMAT "
DATA "The data were converted to random access record files by:"
DATA " "
DATA " Grove Engineering"
DATA " 15215 Shady Grove Road"
DATA " Rockville, MD 20850"
DATA " Phone (301) 258-2727"
DATA " "
DATA "Dave Tocus is the programmer who did much of the neat stuff that makes this"
DATA "program extremely easy to use. We used the True Basic programming system"
DATA "which proved to be outstanding. The team of creators of RADDECAY are very"
DATA "pleased with the result. We trust that you will find this program useful."
DATA " "
DATA "Grove Engineering provides energy and electricity-related engineering and"
DATA "management consulting services to utility, industrial, and maritime"
DATA "organizations; and to the U.S.Navy."
DATA " "
DATA " C.A. Negin"
DATA " September/1987"
DATA " "
DATA " ***** Press [Esc] to return to the main menu *****"
CALL highlight
PRINT tab(7);"Use scroll keys, PgUp, and PgDn to read file; press [Esc] to exit."
PRINT repeat$("─",80);tab(25,1);repeat$("─",80);
CALL normal
LET first = 1
CALL scroll_it(line$,ubound(line$),first,last,3,24,0,2,80)
DO
GET KEY key
SELECT CASE key
CASE 27
EXIT DO
CASE 328,329,336,337
CALL scroll_it(line$,ubound(line$),first,last,3,24,key,2,80)
CASE else
END SELECT
LOOP
END SUB
SUB read_doc2
DIM line$(143)
MAT READ line$
CLEAR
DATA " RADDECAY PROGRAMMING AND FILE STRUCTURE INFORMATION"
DATA " (C.A. Negin - Grove Engineering, Inc - 10/87)"
DATA "1. OVERVIEW"
DATA "RADDECAY is a program for displaying radioactive decay information for 497"
DATA "radionuclides. Data provided include the half life, radioactive daughter"
DATA "nuclides, probabilities per decay, and decay product energies for alphas,"
DATA "betas, positrons, electrons, X-rays, and gammas. What we (with much work by"
DATA "Jody Fletcher) have done is taken the 80 column card image files provided by"
DATA "RSIC in a sequential order corresponding to atomic weight and atomic number,"
DATA "established an alphabetic sequence, generated individual record(random access)"
DATA "files that can be readily accessed by an IBM-PC compatable microcomputer, and"
DATA "provided a program to retrieve the information with user-oriented interaction."
DATA " "
DATA "Programmers with the TrueBasic language can write their own programs to access"
DATA "the data in accordance with the file specifications here. This may also be"
DATA "possible with other languages, however, we haven't tried to do so. We have"
DATA "chosen TrueBasic because:"
DATA " "
DATA " - It automatically supports the math coprocesser."
DATA " - All numbers and calculations are double precision; thus avoiding"
DATA " roundoff anomolies (see below)."
DATA " - The NUM$ function converts numbers to standard IEEE eight byte"
DATA " format. The eight bytes contain a sign bit, an 11 bit exponent,"
DATA " and a 52 bit mantissa. This means that numbers can be represented"
DATA " in a range 1e-307 to 1e+307(roughly), with about 15 digits of"
DATA " precision. Refer to the source listing for use of the NUM function"
DATA " which is for retrieval."
DATA " - The structured nature of TrueBasic make it readily understood by"
DATA " others who may wish to use parts of the program to create their own"
DATA " applications."
DATA " - TrueBasic is automatically compiled. (It does not run in an"
DATA " interpreted mode.)"
DATA " - The compiled code is easily bound into one executable program."
DATA " - TrueBasic is supposed to be transportable between systems; although"
DATA " we have yet to try."
DATA " "
DATA " "
DATA "2. RADDECAY FILES - SYSTEM DISKETTE"
DATA " "
DATA "RADDECAY.EXE - The compiled and bound executable code. This was created by"
DATA "using the TrueBasic Bind (i.e., linker) program and runtime library which"
DATA "Grove Engineering has been licensed by TrueBasic, Inc."
DATA " "
DATA "*.TRU - source files may exist in True Basic language and format."
DATA "These files are not required to execute RADDECAY. True Basic source"
DATA "code is in ASCII format and can be listed with the DOS PRINT or TYPE commands."
DATA "If you have the True Basic language, then you can import the code for use with"
DATA "the TrueBasic screen editor. Any word processer should be able to import the"
DATA "source language."
DATA " "
DATA "3. RADDECAY RECORD FILES DISKETTE"
DATA "The record (random access) files contain all the data. The program retrieval"
DATA "format, which is listed below, can also be found in the source code listing"
DATA "on the system diskette. The seven record files and their format are:"
DATA " "
DATA "NUCLIDES.REC - Contains 497 records corresponding to an alphabetized list of"
DATA "radionuclides. Each record contains single parameter information for the"
DATA "nuclide, pointer information to the location of the products of decay in the"
DATA "remaining record files, and the number of entries in each record file for each"
DATA "product of decay. Each record contains 41 bytes, packed from left to right"
DATA "into 324 bits; that is, 40 bytes & 2 bits. This packing was necessary to"
DATA "allow all the record files to fit on one diskette. The parameters in each"
DATA "record from left to right are in fields as follows:"
DATA " "
DATA "Start Byte Start Bit"
DATA "Byte Length Bit Length Description of parameter(format)"
DATA " "
DATA " 1 8 nuclide name (ASCII)"
DATA " 9 8 atomic weight (IEEE)"
DATA " 17 1 129 8 atomic number (binary field,right justified)"
DATA " 18 8 half life (IEEE)"
DATA " 26 1 half life unit (ASCII) (S = seconds,"
DATA " M = minutes, H = hours, D = days, Y = years)"
DATA " "
DATA "The format for all the remaining numbers in the record is a binary field,"
DATA "right justified within the bit field. All numbers and pointers are for the"
DATA "nuclide named in the first field above. "
DATA " "
DATA " Start No."
DATA " Bit Bits Description of parameter"
DATA " "
DATA " 209 2 number of daughters in the file PROGENY.REC"
DATA " 211 9 first daughter record number in PROGENY.REC"
DATA " 220 7 number of alphas in the file ALPHA.REC"
DATA " 227 13 first alpha record number in ALPHA.REC"
DATA " 240 8 number of betas in the file BETA.REC"
DATA " 248 13 first beta record number in BETA.REC"
DATA " 261 8 number of positrons in the file POSITRON.REC"
DATA " 269 13 first positron record number in POSITRON.REC"
DATA " 282 8 number of electrons in the file ELECTRON.REC"
DATA " 290 13 first electron record number in ELECTRON.REC"
DATA " 303 8 number of photons in the file PHOTON.REC"
DATA " 311 13 first photon record number in PHOTON.REC"
DATA " "
DATA "To retrieve the individual values, you will need to use the True Basic NUM"
DATA "function, which converts an eight byte string stored in IEEE format to a"
DATA "number, and the function UNPACKB which unpacks a specified bit field into an"
DATA "integer value."
DATA " "
DATA "The number of records in each of the remaining files are:"
DATA " number of record length"
DATA " records (bytes)"
DATA "PROGENY.REC 291 16"
DATA "ALPHA.REC 360 16"
DATA "BETA.REC 1700 24"
DATA "POSITRON.REC 138 24"
DATA "ELECTRON.REC 3882 16"
DATA "PHOTON.REC 7480 16"
DATA " "
DATA "All of the values in these files are stored in IEEE format and can be"
DATA "retrieved by using the True Basic NUM function."
DATA " "
DATA "The four files PROGENY.REC, ALPHA.REC, ELECTRON.REC, and PHOTON.REC have a"
DATA "format that consists of a 16 byte record into which two values are stored."
DATA " "
DATA "In each record of the file PROGENY.REC, the first value is the index of this"
DATA "daughter nuclide corresponding to the sequential order in which it appears in"
DATA "the file NUCLIDES.REC, and the second value is the branching ratio (i.e., the"
DATA "fractional yield) per decay of the parent."
DATA " "
DATA "In each record of the three files ALPHA.REC, ELECTRON.REC, and PHOTON.REC, the"
DATA "first value is the energy of the decay product, and the second value is the"
DATA "probability per decay (sometimes called ""abundance""). Photons consist of both"
DATA "gammas and X-rays."
DATA " "
DATA "The two files BETA.REC AND POSITRON.REC have a format that consists of a 24"
DATA "byte record into which three values are stored. The first value is the"
DATA "maximum energy of the decay product, the second value is the average energy,"
DATA "and the third value is the probability per decay."
DATA " "
DATA "4. OTHER FILES"
DATA "RADDECAY.DAT - A file containing parameters for color control and the DOS"
DATA "path to the *.REC files. The purpose of this file is to allow automatic"
DATA "retrieval of parameters you set without having to reset them every time the"
DATA "program is started. The parameters in this file are the path statement, the"
DATA "foreground color, and the background color. If it is not present when"
DATA "execution starts, it will be created with default parameters."
DATA " "
DATA "RADDECAY uses other source code library files while compiling and binding"
DATA "(i.e., linking). These libraries are the property of Grove Engineering, Inc."
DATA "or True Basic, Inc and may be licensed as appropriate to your use."
DATA " "
DATA " ***** Press [Esc] to return to the main menu *****"
CALL highlight
PRINT tab(7);"Use scroll keys, PgUp, and PgDn to read file; press [Esc] to exit."
PRINT repeat$("─",80);tab(25,1);repeat$("─",80);
CALL normal
LET first = 1
CALL scroll_it(line$,ubound(line$),first,last,3,24,0,2,80)
DO
GET KEY key
SELECT CASE key
CASE 27
EXIT DO
CASE 328,329,336,337
CALL scroll_it(line$,ubound(line$),first,last,3,24,key,2,80)
CASE else
END SELECT
LOOP
END SUB
SUB initialize_raddecay
! 11/20/87 - added elemental data
MAT READ nuclide$
DATA "Ac-225 ","Ac-227 ","Ac-228 ","Ag-106m ","Ag-108 ","Ag-108m ","Ag-109m ","Ag-110 "
DATA "Ag-110m ","Ag-111 ","Al-26 ","Al-28 ","Am-241 ","Am-242 ","Am-242m ","Am-243 "
DATA "Am-244 ","Am-245 ","Am-246 ","Ar-37 ","Ar-39 ","Ar-41 ","As-72 ","As-73 "
DATA "As-74 ","As-76 ","As-77 ","At-211 ","At-217 ","Au-194 ","Au-195 ","Au-195m "
DATA "Au-196 ","Au-198 ","Au-199 ","Ba-131 ","Ba-133 ","Ba-133m ","Ba-135m ","Ba-137m "
DATA "Ba-139 ","Ba-140 ","Ba-141 ","Ba-142 ","Be-7 ","Be-10 ","Bi-206 ","Bi-207 "
DATA "Bi-208 ","Bi-210 ","Bi-211 ","Bi-212 ","Bi-213 ","Bi-214 ","Bk-249 ","Bk-250 "
DATA "Bk-251 ","Br-77 ","Br-80 ","Br-80m ","Br-82 ","Br-83 ","Br-84 ","Br-85 "
DATA "C-11 ","C-14 ","C-15 ","Ca-41 ","Ca-45 ","Ca-47 ","Ca-49 ","Cd-109 ","Cd-111m "
DATA "Cd-113 ","Cd-113m ","Cd-115 ","Cd-115m ","Cd-117 ","Cd-117m ","Ce-139 ","Ce-141 "
DATA "Ce-143 ","Ce-144 ","Cf-248 ","Cf-249 ","Cf-250 ","Cf-251 ","Cf-252 ","Cf-253 "
DATA "Cf-254 ","Cl-36 ","Cl-38 ","Cm-242 ","Cm-243 ","Cm-244 ","Cm-245 ","Cm-246 "
DATA "Cm-247 ","Cm-248 ","Cm-249 ","Cm-250 ","Co-56 ","Co-57 ","Co-58 ","Co-58m "
DATA "Co-60 ","Co-60m ","Co-61 ","Cr-49 ","Cr-51 ","Cs-126 ","Cs-129 ","Cs-131 "
DATA "Cs-132 ","Cs-134 ","Cs-134m ","Cs-135 ","Cs-136 ","Cs-137 ","Cs-138 ","Cs-139 "
DATA "Cu-61 ","Cu-62 ","Cu-64 ","Cu-67 ","Dy-157 ","Dy-165 ","Dy-166 ","Er-169 "
DATA "Er-171 ","Es-253 ","Es-254 ","Es-254m ","Es-255 ","Eu-152 ","Eu-152m ","Eu-154 "
DATA "Eu-155 ","Eu-156 ","F-18 ","Fe-52 ","Fe-55 ","Fe-59 ","Fm-254 ","Fm-255 "
DATA "Fm-256 ","Fr-221 ","Fr-223 ","Ga-66 ","Ga-67 ","Ga-68 ","Ga-72 ","Gd-152 "
DATA "Gd-153 ","Gd-159 ","Gd-162 ","Ge-68 ","Ge-71 ","Ge-77 ","H-3 ","Hf-181 "
DATA "Hg-197 ","Hg-197m ","Hg-203 ","Ho-166 ","Ho-166m ","I-122 ","I-123 ","I-124 "
DATA "I-125 ","I-126 ","I-128 ","I-129 ","I-130 ","I-131 ","I-132 ","I-133 "
DATA "I-134 ","I-135 ","I-136 ","In-111 ","In-113m ","In-114 ","In-114m ","In-115 "
DATA "In-115m ","In-116m ","In-117 ","In-117m ","Ir-190 ","Ir-190m1","Ir-190m2","Ir-192 "
DATA "Ir-193m ","Ir-194 ","Ir-194m ","K-40 ","K-42 ","K-43 ","Kr-79 ","Kr-81 "
DATA "Kr-83m ","Kr-85 ","Kr-85m ","Kr-87 ","Kr-88 ","Kr-89 ","Kr-90 ","La-140 "
DATA "La-141 ","La-142 ","Lu-177 ","Lu-177m ","Mg-27 ","Mg-28 ","Mn-52 ","Mn-52m "
DATA "Mn-53 ","Mn-54 ","Mn-56 ","Mn-57 ","Mo-91 ","Mo-93 ","Mo-99 ","Mo-101 "
DATA "N-13 ","N-16 ","Na-22 ","Na-24 ","Nb-90 ","Nb-91 ","Nb-91m ","Nb-92 "
DATA "Nb-92m ","Nb-93m ","Nb-94 ","Nb-94m ","Nb-95 ","Nb-95m ","Nb-96 ","Nb-97 "
DATA "Nb-97m ","Nd-147 ","Nd-149 ","Ni-56 ","Ni-57 ","Ni-59 ","Ni-63 ","Ni-65 "
DATA "Np-235 ","Np-236 ","Np-236m ","Np-237 ","Np-238 ","Np-239 ","Np-240 ","Np-240m "
DATA "O-15 ","Os-185 ","Os-186 ","Os-190m ","Os-191 ","Os-191m ","Os-193 ","P-32 "
DATA "P-33 ","Pa-230 ","Pa-231 ","Pa-233 ","Pa-234 ","Pa-234m ","Pb-203 ","Pb-204m "
DATA "Pb-205 ","Pb-209 ","Pb-210 ","Pb-211 ","Pb-212 ","Pb-214 ","Pd-103 ","Pd-107 "
DATA "Pd-109 ","Pm-143 ","Pm-144 ","Pm-145 ","Pm-146 ","Pm-147 ","Pm-148 ","Pm-148m "
DATA "Pm-149 ","Pm-151 ","Po-209 ","Po-210 ","Po-211 ","Po-212 ","Po-213 ","Po-214 "
DATA "Po-215 ","Po-216 ","Po-218 ","Pr-142 ","Pr-143 ","Pr-144 ","Pr-144m ","Pt-191 "
DATA "Pt-193 ","Pt-193m ","Pt-195m ","Pt-197 ","Pt-197m ","Pu-236 ","Pu-237 ","Pu-238 "
DATA "Pu-239 ","Pu-240 ","Pu-241 ","Pu-242 ","Pu-243 ","Pu-244 ","Pu-245 ","Pu-246 "
DATA "Ra-222 ","Ra-223 ","Ra-224 ","Ra-225 ","Ra-226 ","Ra-228 ","Rb-81 ","Rb-82 "
DATA "Rb-83 ","Rb-84 ","Rb-86 ","Rb-87 ","Rb-88 ","Rb-89 ","Rb-90 ","Rb-90m "
DATA "Re-182 ","Re-182m ","Re-183 ","Re-184 ","Re-184m ","Re-186 ","Re-187 ","Re-188 "
DATA "Rh-103m ","Rh-105 ","Rh-105m ","Rh-106 ","Rn-218 ","Rn-219 ","Rn-220 ","Rn-222 "
DATA "Ru-97 ","Ru-103 ","Ru-105 ","Ru-106 ","S-35 ","Sb-117 ","Sb-122 ","Sb-124 "
DATA "Sb-125 ","Sb-126 ","Sb-126m ","Sb-127 ","Sb-129 ","Sc-44 ","Sc-46 ","Sc-46m "
DATA "Sc-47 ","Sc-48 ","Sc-49 ","Se-73 ","Se-75 ","Se-79 ","Si-31 ","Si-32 "
DATA "Sm-147 ","Sm-151 ","Sm-153 ","Sn-113 ","Sn-117m ","Sn-119m ","Sn-123 ","Sn-125 "
DATA "Sn-126 ","Sr-82 ","Sr-85 ","Sr-85m ","Sr-87m ","Sr-89 ","Sr-90 ","Sr-91 "
DATA "Sr-92 ","Sr-93 ","Ta-182 ","Tb-157 ","Tb-160 ","Tb-162 ","Tc-95 ","Tc-95m "
DATA "Tc-96 ","Tc-96m ","Tc-97 ","Tc-97m ","Tc-98 ","Tc-99 ","Tc-99m ","Tc-101 "
DATA "Te-121 ","Te-121m ","Te-123 ","Te-123m ","Te-125m ","Te-127 ","Te-127m ","Te-129 "
DATA "Te-129m ","Te-131 ","Te-131m ","Te-132 ","Te-133 ","Te-133m ","Te-134 ","Th-226 "
DATA "Th-227 ","Th-228 ","Th-229 ","Th-230 ","Th-231 ","Th-232 ","Th-233 ","Th-234 "
DATA "Ti-44 ","Ti-45 ","Ti-51 ","Tl-200 ","Tl-201 ","Tl-202 ","Tl-204 ","Tl-207 "
DATA "Tl-208 ","Tl-209 ","Tl-210 ","Tm-170 ","Tm-171 ","U-230 ","U-231 ","U-232 "
DATA "U-233 ","U-234 ","U-235 ","U-236 ","U-237 ","U-238 ","U-239 ","U-240 "
DATA "V-48 ","V-49 ","V-52 ","W-181 ","W-185 ","W-187 ","W-188 ","Xe-122 "
DATA "Xe-123 ","Xe-125 ","Xe-127 ","Xe-129m ","Xe-131m ","Xe-133 ","Xe-133m ","Xe-135 "
DATA "Xe-135m ","Xe-137 ","Xe-138 ","Y-86 ","Y-87 ","Y-88 ","Y-90 ","Y-90m "
DATA "Y-91 ","Y-91m ","Y-92 ","Y-93 ","Yb-169 ","Yb-175 ","Zn-62 ","Zn-65 "
DATA "Zn-69 ","Zn-69m ","Zr-86 ","Zr-88 ","Zr-89 ","Zr-93 ","Zr-95 ","Zr-97 "
MAT READ at_names$
DATA Hydrogen,Helium,Lithium,Beryllium,Boron,Carbon,Nitrogen,Oxygen,Fluorine,Neon
DATA Sodium,Magnesium,Aluminum,Silicon,Phosphorus,Sulfur,Chlorine,Argon,Potassium,Calcium
DATA Scandium,Titanium,Vanadium,Chromium,Manganese,Iron,Cobalt,Nickel,Copper,Zinc
DATA Gallium,Germanium,Arsenic,Selenium,Bromine,Krypton,Rubidium,Strontium,Yttrium,Zirconium
DATA Niobium,Molybdenum,Technetium,Ruthenium,Rhodium,Palladium,Silver,Cadmium,Indium,Tin
DATA Antimony,Tellurium,Iodine,Xenon,Cesium,Barium,Lanthanum,Cerium,Praseodymium,Neodymium
DATA Promethium,Samarium,Europium,Gadolinium,Terbium,Dysprosium,Holmium,Erbium,Thulium,Ytterbium
DATA Lutetium,Hafnium,Tantalum,Tungsten,Rhenium,Osmium,Iridium,Platinum,Gold,Mercury
DATA Thallium,Lead,Bismuth,Polonium,Astatine,Radon,Francium,Radium,Actinium,Thorium
DATA Protactinium,Uranium,Neptunium,Plutonium,Americium,Curium,Berkelium,Californium,Einsteinium,Fermium
MAT READ mol_wt
DATA 1.008, 4.0026, 6.939, 9.0122, 10.811, 12.0112, 14.0067, 15.9994
DATA 18.9984, 20.183, 22.9898, 24.312, 26.9815, 28.086, 30.9738, 32.064
DATA 35.453, 39.948, 39.102, 40.08, 44.956, 47.9, 50.942, 51.996
DATA 54.938, 55.847, 58.9332, 58.71, 63.546, 65.37, 69.72, 72.59
DATA 74.9216, 78.96, 79.904, 83.8, 85.47, 87.62, 88.905, 91.22
DATA 92.906, 95.94, 99, 101.07, 102.905, 106.4, 107.868, 112.4
DATA 114.82, 118.69, 121.75, 127.6, 126.904, 131.3, 132.905, 137.34
DATA 138.91, 140.12, 140.907, 144.24, 145, 150.35, 151.96, 157.25
DATA 158.924, 162.5, 164.93, 167.26, 168.934, 173.04, 174.97, 178.49
DATA 180.948, 183.85, 186.2, 190.2, 192.2, 195.09, 196.967, 200.59
DATA 204.37, 207.19, 208.98, 210, 210, 222, 223, 226.05
DATA 227, 232.038, 231, 238.03, 237, 244, 243, 245
DATA 249, 249, 254, 252
MAT READ element_ID
DATA 89, 89, 89, 47, 47, 47, 47, 47, 47, 47, 13, 13, 95, 95, 95, 95
DATA 95, 95, 95, 18, 18, 18, 33, 33, 33, 33, 33, 85, 85, 79, 79, 79
DATA 79, 79, 79, 56, 56, 56, 56, 56, 56, 56, 56, 56, 4, 4, 83, 83
DATA 83, 83, 83, 83, 83, 83, 97, 97, 97, 35, 35, 35, 35, 35, 35, 35
DATA 6, 6, 6, 20, 20, 20, 20, 48, 48, 48, 48, 48, 48, 48, 48, 58
DATA 58, 58, 58, 98, 98, 98, 98, 98, 98, 98, 17, 17, 96, 96, 96, 96
DATA 96, 96, 96, 96, 96, 27, 27, 27, 27, 27, 27, 27, 24, 24, 55, 55
DATA 55, 55, 55, 55, 55, 55, 55, 55, 55, 29, 29, 29, 29, 66, 66, 66
DATA 68, 68, 99, 99, 99, 99, 63, 63, 63, 63, 63, 9, 26, 26, 26, 100
DATA 100,100,87, 87, 31, 31, 31, 31, 64, 64, 64, 64, 32, 32, 32, 1
DATA 72, 80, 80, 80, 67, 67, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53
DATA 53, 53, 53, 53, 49, 49, 49, 49, 49, 49, 49, 49, 49, 77, 77, 77
DATA 77, 77, 77, 77, 19, 19, 19, 36, 36, 36, 36, 36, 36, 36, 36, 36
DATA 57, 57, 57, 71, 71, 12, 12, 25, 25, 25, 25, 25, 25, 42, 42, 42
DATA 42, 7, 7, 11, 11, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41
DATA 41, 41, 60, 60, 28, 28, 28, 28, 28, 93, 93, 93, 93, 93, 93, 93
DATA 93, 8, 76, 76, 76, 76, 76, 76, 15, 15, 91, 91, 91, 91, 91, 82
DATA 82, 82, 82, 82, 82, 82, 82, 46, 46, 46, 61, 61, 61, 61, 61, 61
DATA 61, 61, 61, 84, 84, 84, 84, 84, 84, 84, 84, 84, 59, 59, 59, 59
DATA 78, 78, 78, 78, 78, 78, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94
DATA 94, 88, 88, 88, 88, 88, 88, 37, 37, 37, 37, 37, 37, 37, 37, 37
DATA 37, 75, 75, 75, 75, 75, 75, 75, 75, 45, 45, 45, 45, 86, 86, 86
DATA 86, 44, 44, 44, 44, 16, 51, 51, 51, 51, 51, 51, 51, 51, 21, 21
DATA 21, 21, 21, 21, 34, 34, 34, 14, 14, 62, 62, 62, 50, 50, 50, 50
DATA 50, 50, 38, 38, 38, 38, 38, 38, 38, 38, 38, 73, 65, 65, 65, 43
DATA 43, 43, 43, 43, 43, 43, 43, 43, 43, 52, 52, 52, 52, 52, 52, 52
DATA 52, 52, 52, 52, 52, 52, 52, 52, 90, 90, 90, 90, 90, 90, 90, 90
DATA 90, 22, 22, 22, 81, 81, 81, 81, 81, 81, 81, 81, 69, 69, 92, 92
DATA 92, 92, 92, 92, 92, 92, 92, 92, 92, 23, 23, 23, 74, 74, 74, 74
DATA 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 39, 39, 39, 39
DATA 39, 39, 39, 39, 39, 70, 70, 30, 30, 30, 30, 40, 40, 40, 40, 40
DATA 40
END SUB
END MODULE